package com.lxs.demo;

import java.util.concurrent.CompletableFuture;

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.PathVariable;
import org.springframework.web.bind.annotation.RestController;

import com.netflix.hystrix.contrib.javanica.annotation.DefaultProperties;
import com.netflix.hystrix.contrib.javanica.annotation.HystrixCommand;
import com.netflix.hystrix.contrib.javanica.annotation.HystrixProperty;

/**   
 * @标题: EdgeService.java 
 * @包名: com.lxs.demo 
 * @描述: 使用 Feign 声明式方式实现服务间的远程调用
 * @作者: Mr. Liao
 * @时间: 2018年10月19日 上午11:06:10 
 * @版权: (c) 2018
*/
@RestController
@DefaultProperties(defaultFallback="defaultFallback")
public class EdgeService implements EdgeInterface{
	
	@Autowired
	Service1Client service1Client;
	
	@Autowired
	Service2Client service2Client;
	
	/*   
	 * (non-Javadoc)
	 * @作者: Mr. Liao 
	 * @时间: 2018年10月19日 上午11:16:27 
	 * @描述: @HystrixCommand 熔断参数
	 * @return
	 * @see com.lxs.demo.EdgeInterface#status()
	 * @备注:  
	*/
	@HystrixCommand(commandProperties= {
			@HystrixProperty(name="circuitBreaker.enabled",value="true"),//是否开启熔断
			@HystrixProperty(name="circuitBreaker.requestVolumeThreshold",value="6"),//时间窗口内需达到一定的调用次数（默认20）统计生效
			@HystrixProperty(name="circuitBreaker.sleepWindowInMilliseconds",value="8000"),//熔断开启后，默认等待5秒后变更为半开启状态
			@HystrixProperty(name="circuitBreaker.errorThresholdPercentage",value="30"),//失败率阈值，默认失败率达到50%,才会触发熔断
			@HystrixProperty(name="execution.isolation.thread.timeoutInMilliseconds",value="1000"), //超时时间，默认1000毫秒
			@HystrixProperty(name="metrics.rollingStats.timeInMilliseconds",value="10000")//默认5秒为一次统计周期，术语描述：滚动窗口的长度为5秒
			})
	public String status() {
		return service1Client.getInfo();
	}
	
	@HystrixCommand(fallbackMethod="fallback",commandProperties= {
			@HystrixProperty(name="circuitBreaker.enabled",value="true"),//是否开启熔断
			@HystrixProperty(name="circuitBreaker.requestVolumeThreshold",value="6"),//时间窗口内需达到一定的调用次数（默认20）统计生效
			@HystrixProperty(name="circuitBreaker.sleepWindowInMilliseconds",value="8000"),//熔断开启后，默认等待5秒后变更为半开启状态
			@HystrixProperty(name="circuitBreaker.errorThresholdPercentage",value="30"),//失败率阈值，默认失败率达到50%,才会触发熔断
			@HystrixProperty(name="execution.isolation.thread.timeoutInMilliseconds",value="1000"), //超时时间，默认1000毫秒
			@HystrixProperty(name="metrics.rollingStats.timeInMilliseconds",value="10000")//默认5秒为一次统计周期，术语描述：滚动窗口的长度为5秒
			})
	public String circuit(@PathVariable("id")Integer num) {
		if(num%2!=0) {
			return "success";
		}
		throw new RuntimeException();
	}
	
	@HystrixCommand(commandProperties= {
			@HystrixProperty(name="circuitBreaker.enabled",value="true"),//是否开启熔断
			@HystrixProperty(name="circuitBreaker.requestVolumeThreshold",value="6"),//时间窗口内需达到一定的调用次数（默认20）统计生效
			@HystrixProperty(name="circuitBreaker.sleepWindowInMilliseconds",value="8000"),//熔断开启后，默认等待5秒后变更为半开启状态
			@HystrixProperty(name="circuitBreaker.errorThresholdPercentage",value="30"),//失败率阈值，默认失败率达到50%,才会触发熔断
			@HystrixProperty(name="execution.isolation.thread.timeoutInMilliseconds",value="1000"), //超时时间，默认1000毫秒
			@HystrixProperty(name="metrics.rollingStats.timeInMilliseconds",value="10000")//默认5秒为一次统计周期，术语描述：滚动窗口的长度为5秒
			})
	public String services() {
		CompletableFuture<String> future1 = CompletableFuture.supplyAsync(() -> service1Client.getInfo());
		CompletableFuture<String> future2 = CompletableFuture.supplyAsync(() -> service2Client.getInfo());
		try {
			return future1.get()+";"+future2.get();
		} catch (Exception e) {
			throw new RuntimeException(e);
		}
		
	}

	/*   
	 * (non-Javadoc)
	 * @作者: Mr. Liao 
	 * @时间: 2018年10月19日 上午11:08:15 
	 * @描述: 默认降级方法
	 * @return
	 * @see com.lxs.demo.EdgeInterface#defaultFallback()
	 * @备注:  
	*/
	@Override
	public String defaultFallback() {
		return "I’m too busy now!";
	}

	@HystrixCommand(commandProperties= {
			@HystrixProperty(name="circuitBreaker.enabled",value="true"),//是否开启熔断
			@HystrixProperty(name="circuitBreaker.requestVolumeThreshold",value="6"),//时间窗口内需达到一定的调用次数（默认20）统计生效
			@HystrixProperty(name="circuitBreaker.sleepWindowInMilliseconds",value="8000"),//熔断开启后，默认等待5秒后变更为半开启状态
			@HystrixProperty(name="circuitBreaker.errorThresholdPercentage",value="30"),//失败率阈值，默认失败率达到50%,才会触发熔断
			@HystrixProperty(name="execution.isolation.thread.timeoutInMilliseconds",value="1000"), //超时时间，默认1000毫秒
			@HystrixProperty(name="metrics.rollingStats.timeInMilliseconds",value="10000")//默认5秒为一次统计周期，术语描述：滚动窗口的长度为5秒
			})
	public String status2() {
		return service2Client.getInfo();
	}

	public String fallback(Integer s) {
		return "电路断了";
	}
}
